import os

from langchain.agents import ZeroShotAgent, AgentExecutor
from langchain_core.prompts import PromptTemplate
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model_name="qwen-plus",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    temperature=0
)


@tool(
    description="解析求职者的简历,提取关键字信息(工作经验和专业技能).参数:resume_text(求职者简历的内容,字符串,例如: 王科宇,5年工作经验,拥有Python,LangChain,大模型等技能),返回值:解析结果(字符串,例如:工作经验5年,专业技能:Python,LangChain,大模型)"
)
def resume_parser(resume_text: str) -> str:
    has_year = "5年" in resume_text
    has_skills = "Python" in resume_text and "LangChain" in resume_text and "大模型" in resume_text

    if has_year and has_skills:
        return "解析结果:工作经验5年, 专业技能:Python,LangChain,大模型"
    return "解析结果:工作经验2年,专业技能:JAVA,SpringBoot,Maven"


@tool(
    description="计算求职者简历内容和岗位的匹配分数,分数越高月匹配,参数:resume_text_str(求职者简历的解析结果,字符串,例如: 工作经验5年, 专业技能:Python,LangChain,大模型),返回值:匹配结果(字符串,例如:匹配度为100分)"
)
def job_matcher(resume_text_str: str) -> str:
    score = 0
    if "Python" in resume_text_str:
        score += 30
    if "LangChain" in resume_text_str:
        score += 10
    if "大模型" in resume_text_str:
        score += 30
    if "RAG" in resume_text_str:
        score += 20
    if "5年" in resume_text_str:
        score += 10
    if "2年" in resume_text_str:
        score += 5
    if "JAVA" in resume_text_str:
        score += 30
    if "SpringBoot" in resume_text_str:
        score += 10
    if "Maven" in resume_text_str:
        score += 10

    return f"""
    【匹配结果】
    匹配度:{str(score)}分"
    """


# 匹配结果:匹配度为80分

@tool(
    description="根据匹配分数生成给求职者的沟通话术,参数:matcher_result(匹配分数,字符串,例如:【匹配结果】匹配度为80分),返回值:沟通话术(字符串,例如:您好, 您的简历内容和我公司招聘的岗位匹配度很高, 我们会尽快安排面试, 请保持电话畅通, 谢谢!)"
)
def gen_message(matcher_result: str) -> str:
    sroce = matcher_result.split(":")[1].replace("分", "")
    if int(sroce) >= 80:
        return """
        您好, 您的简历内容和我公司招聘的岗位匹配度很高, 
        我们会尽快安排面试, 请保持电话畅通, 谢谢!
        """
    elif int(sroce) >= 60 and int(sroce) < 80:
        return """
        您好, 您的简历内容和我公司招聘的岗位匹配度一般, 
        我们暂时把您的简历放到人才库 ,有机会我们会联系您, 谢谢!
        """
    return """
    您好, 您的简历内容和我公司招聘的岗位匹配度很低, 
    暂时不考虑您, 谢谢!
    """


tools = [resume_parser, job_matcher, gen_message]

template = f"""
你是[boss直聘]的智能招聘助手,负责处理求职者简历的匹配和沟通话术生成,
你拥有一下工具:
{tools}

使用规则:
1:首先使用resume_parser工具解析求职者的简历,提取关键字信息(工作经验和专业技能)
2:然后使用job_matcher工具计算求职者简历内容和岗位的匹配分数,分数越高越匹配
3:最后使用gen_message工具根据匹配分数生成给求职者的沟通话术


用户输入:{input}
"""

prompt = PromptTemplate(
    template=template,
    input_variables=["input", "tools"],
    partial_variables={
        "tools": "\n".join([f"- {tool.name}：{tool.description}" for tool in tools]),
    }

)

agent = ZeroShotAgent.from_llm_and_tools(
    llm=llm,
    tools=tools,
    prompt=prompt,
    verbose=True
)

executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=5,
)

if __name__ == '__main__':
    resume_high_match = """
     姓名：韦凯齐
     工作经验：2年
     技能：Java、Springboot、Maven
     项目：主导开发过企业级AI客服Agent系统，使用Springboot实现工具调用逻辑
     薪资:15-20K
     """

    output = executor.invoke(
        {
            "input": resume_high_match
        }
    )

    print(output)
